<?php
/**
 * コメントAPIコントローラー
 *
 * @package  app
 * @extends  Controller
 */
class Controller_Api_Comment extends Controller_Apibase {
	/**
	 * コメント取得
	 *
	 * @access  public
	 * @return  Response
	 */
	public function action_get() {
		$post = Input::post();
		$member_id = $post["member_id"];
		$json = array();

		// キャッシュ有無
		$song = $this -> get_song($this -> song_where);
		try {
			$ckey = $this -> ckey('comment', 'get', $song["song_id"]);
			$json = Cache::get($ckey);
			Log::debug('Cache Hit');
		} catch (\CacheNotFoundException $e) {
			// コメント一覧を取得
			if (isset($song["create_date"])) {
				// 既存曲
				$query = DB::select('comment_id', 'word', 'seconds');
				$query -> from('comment');
				$query -> where('del_flg', 0);
				$query -> where('song_id', $song["song_id"]);
				$query -> order_by('comment_id', 'desc');
				$query -> limit(Config::get('maxrows_commentlist'));
				$json = $query -> execute() -> as_array();
			}

			// キャッシュ保存
			$json = json_encode($json);
			Cache::set($ckey, $json, Config::get('cache_comment_expiration'));
		}

		// 再生カウント
		if (!empty($post['play'])) {
			// 連投規制
			$query = DB::select(DB::expr('COUNT(*) AS count'));
			$query -> from('play');
			$query -> where('member_id', $member_id);
			$query -> where('song_id', $song["song_id"]);
			$query -> where('create_date', '>', DB::expr('NOW() - INTERVAL ' . Config::get('regulation_comment_play') . ' SECOND'));
			$result = $query -> execute() -> as_array();
			if ($result[0]['count'] == 0) {
				// 履歴
				$values = $this -> member_where_other;
				$values["song_id"] = $song["song_id"];
				$query = DB::insert('play');
				$query -> set($values) -> execute();

				// 累計
				$query = DB::update('song');
				$query -> set(array('count_play' => DB::expr('count_play + 1')));
				$query -> where('song_id', $song['song_id']);
				$query -> execute();
			}
		}

		return Response::forge($json, D_HTTP_CACHE);
	}

	/**
	 * コメント投稿
	 *
	 * @access  public
	 * @return  Response
	 */
	public function action_post() {
		$post = Input::post();
		$member_id = $post["member_id"];

		$song = $this -> get_song($this -> song_where);
		$song_id = $song["song_id"];

		// 連投規制
		$query = DB::select(DB::expr('COUNT(*) AS count'));
		$query -> from('comment');
		$query -> where('member_id', $member_id);
		$query -> where('song_id', $song_id);
		$query -> where('create_date', '>', DB::expr('NOW() - INTERVAL ' . Config::get('regulation_comment_post') . ' SECOND'));
		$result = $query -> execute() -> as_array();
		if ($result[0]['count'] > 0) {
			return Response::forge(null, D_HTTP_WARNING);
		}

		// コメントを登録
		// とりあえず10個まで同時登録可能
		for ($i = 1; $i < 10; $i++) {
			if (empty($post["word" . $i]))
				break;

			$values = array('song_id' => $song_id, 'member_id' => $member_id, 'word' => $post['word' . $i], 'seconds' => $post['seconds' . $i]);
			$query = DB::insert('comment');
			$query -> set($values);
			$query -> execute();
		}

		// 累計
		$query = DB::update('song');
		$query -> set(array('count_comment' => DB::expr('count_comment + 1')));
		$query -> where('song_id', $song_id);
		$query -> execute();

		// 成果確認
		$done = $this -> get_outcome();
		if (strcmp($done['comment_post'], '0') == 0) {
			$this -> set_outcome($post['member_id'], 'comment_post');
		}

		// キャッシュクリア
		$ckey = $this -> ckey('comment', 'get', $song_id);
		Cache::delete($ckey);

		return Response::forge(null, D_HTTP_UPDATE);
	}

	/**
	 * コメント通報
	 *
	 * @access  public
	 * @return  Response
	 */
	public function action_report() {
		$post = Input::post();

		// 該当有無確認
		$query = DB::select('song_id');
		$query -> from('comment');
		$query -> where('comment_id', $post['comment_id']);
		$song = $query -> execute() -> as_array();

		// コメントを削除
		$query = DB::update('comment');
		$query -> set(array('del_flg' => 1));
		$query -> where('comment_id', $post['comment_id']);
		$query -> execute();

		// 通報理由を記録
		$values = $this -> member_where_other;
		$values['comment_id'] = $post['comment_id'];
		$values['word'] = $post['word'];
		$query = DB::insert('report');
		$query -> set($values);
		$query -> execute();

		// キャッシュクリア
		$ckey = $this -> ckey('comment', 'get', $song[0]['song_id']);
		Cache::delete($ckey);

		return Response::forge(null, D_HTTP_UPDATE);
	}

}
